home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / BBS_UTL / TOOL_USE / CINPUT.PAS < prev    next >
Pascal/Delphi Source File  |  1989-03-01  |  11KB  |  446 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. {$i prodef.inc}
  14.  
  15. unit CInput;
  16.  
  17. interface
  18.  
  19.    Uses
  20.       Dos, MiniCrt, Mdosio, Tools;
  21.  
  22.    var
  23.       linenum:       integer;
  24.       pending_keys:  string;
  25.       cmdline:       string;
  26.       par:           string;
  27.       ontime:        integer;
  28.       tleft:         integer;
  29.  
  30.    const
  31.       tlimit:  integer = 10;  {default time limit}
  32.       comport: integer = 0;   {default to local, monitor carrier if 1 or 2}
  33.  
  34.       allow_flagging = false;
  35.       graphics = false;
  36.       red = '';
  37.       green = '';
  38.       yellow = '';
  39.       blue = '';
  40.       magenta = '';
  41.       cyan = '';
  42.       white = '';
  43.       gray = '';
  44.       fun_arcview = 'V';
  45.       fun_textview = 'T';
  46.       fun_xtract = 'X';
  47.       enter_eq = '(Enter)=';
  48.       option = '';
  49.       expert = true;
  50.       dump_user: boolean = false;
  51.  
  52.    type
  53.       user_rec = record
  54.            pagelen: integer;
  55.       end;
  56.  
  57.    const
  58.       user: user_rec = (pagelen:22);
  59.       o_logoff = 'x';
  60.       o_offok = 'x';
  61.       o_offerr = 'x';
  62.  
  63.    const
  64.       queue_size       =  300;   {fixed size of all queues}
  65.       queue_high_water =  255;   {maximum queue.count before blocking}
  66.       queue_low_water  =  100;   {unblock queue at this point}
  67.  
  68.    type
  69.       queue_rec = record
  70.          next_in:  integer;
  71.          next_out: integer;
  72.          count:    integer;
  73.          data:     array[1..queue_size] of char;
  74.       end;
  75.  
  76.    {$i intrcomm.int}
  77.  
  78.    procedure opencom(port: integer);
  79.    procedure closecom;
  80.    function local: boolean;
  81.  
  82.    procedure disp(msg:  string);
  83.    procedure newline;
  84.    procedure displn(msg:  string);
  85.    procedure space;
  86.    procedure spaces(n: integer);
  87.    procedure input(var line:  string; maxlen:    integer);
  88.    procedure prompt_def(what,options: string);
  89.    procedure get_def(what,options: string);
  90.    procedure get_cmdline_raw(len: integer);
  91.  
  92.    procedure dRED(m: string);
  93.    procedure dGREEN(m: string);
  94.    procedure dYELLOW(m: string);
  95.    procedure dBLUE(m: string);
  96.    procedure dMAGENTA(m: string);
  97.    procedure dCYAN(m: string);
  98.    procedure dWHITE(m: string);
  99.    procedure dGRAY(m: string);
  100.    procedure default_color;
  101.  
  102.    procedure get_cmdline;
  103.    function scan_nextpar(var cmdline: string): string;
  104.    procedure get_nextpar;
  105.  
  106.    function verify_level(fun: char): boolean;
  107.    procedure set_function(fun: char);
  108.    procedure erase_prompt(len: integer);
  109.    procedure check_time_left;
  110.    procedure display_time(left: boolean);
  111.    procedure flag_files;
  112.    procedure make_log_entry(s:string; f:boolean);
  113.  
  114.  
  115. (* ------------------------------------------------------------ *)
  116. implementation
  117.  
  118.    {$i intrcomm.inc}
  119.  
  120.    function local: boolean;
  121.    begin
  122.       local := (comport = 0);
  123.    end;
  124.  
  125.    procedure opencom(port: integer);
  126.    begin
  127.       comport := port;
  128.       if (comport = 1) or (comport = 2) then
  129.          INTR_init_com(comport-1);
  130.    end;
  131.  
  132.    procedure closecom;
  133.    begin
  134.       if not local then
  135.          INTR_uninit_com;
  136.    end;
  137.  
  138.    procedure dRED(m: string);    begin disp(RED+m); end;
  139.    procedure dGREEN(m: string);  begin disp(GREEN+m); end;
  140.    procedure dYELLOW(m: string); begin disp(YELLOW+m); end;
  141.    procedure dBLUE(m: string);   begin disp(BLUE+m); end;
  142.    procedure dMAGENTA(m: string);begin disp(MAGENTA+m); end;
  143.    procedure dCYAN(m: string);   begin disp(CYAN+m); end;
  144.    procedure dWHITE(m: string);  begin disp(WHITE+m); end;
  145.    procedure dGRAY(m: string);   begin disp(GRAY+m); end;
  146.    procedure default_color;      begin disp(GRAY); end;
  147.  
  148.  
  149.    (* ------------------------------------------------------------ *)
  150.    procedure get_cmdline;
  151.       (* read next command line *)
  152.    var
  153.       i: integer;
  154.  
  155.    begin
  156.       fillchar(cmdline,sizeof(cmdline),0);
  157.       input(cmdline,sizeof(cmdline)-1);
  158.       stoupper(cmdline);
  159.       newline;
  160.  
  161.       {process stacked 'ns' at end of command line}
  162.       i := pos(' NS',cmdline);
  163.       if i = 0 then
  164.          i := pos(';NS',cmdline);
  165.  
  166.       if (i > 0) and (i = length(cmdline)-2) then
  167.       begin
  168.          cmdline[0] := chr(i-1);
  169.          linenum := -30000;    {go 30000 lines before stopping again}
  170.       end;
  171.    end;
  172.  
  173.  
  174.    (* ------------------------------------------------------------ *)
  175.    function scan_nextpar(var cmdline: string): string;
  176.       (* get the next space or ';' delimited part of a command line
  177.          and return it (removing the string from the command line) *)
  178.    var
  179.       i:      integer;
  180.       par:    string;
  181.  
  182.    begin
  183.       fillchar(par,sizeof(par),0);
  184.       while copy(cmdline,1,1) = ' ' do   {remove leading spaces}
  185.          delete(cmdline,1,1);
  186.  
  187.       (* find the end of the next word *)
  188.       i := 1;
  189.       while (i <= length(cmdline)) and (cmdline[i] <> ' ') and
  190.             (cmdline[i] <> ';') and (cmdline[i] <> ',') do
  191.          inc(i);
  192.  
  193.       (* copy the word to the next param and delete it from the command line *)
  194.       par := copy(cmdline,1,i-1);
  195.       delete(cmdline,1,i);
  196.  
  197.       scan_nextpar := par;
  198.    end;
  199.  
  200.  
  201.    (* ------------------------------------------------------------ *)
  202.    procedure get_nextpar;
  203.       (* get the next space or ';' delimited part of the command line
  204.          and move it to 'par' *)
  205.    begin
  206.       fillchar(par,sizeof(par),0);
  207.       par := scan_nextpar(cmdline);
  208.    end;
  209.  
  210.  
  211.    (* ------------------------------------------------------------ *)
  212.    procedure disp(msg:  string);
  213.    begin
  214.       write(msg);
  215.       if not local then
  216.       begin
  217.          INTR_transmit_data(msg);
  218.          if (port[port_base+MSR] and MSR_RLSD)=0 then
  219.             dump_user := true;
  220.       end;
  221.    end;
  222.  
  223.    (* ------------------------------------------------------------ *)
  224.    procedure newline;
  225.    var
  226.       c: char;
  227.  
  228.    begin
  229. {WRITE('`1');}
  230.       verify_txque_space;
  231. {WRITE('`2');}
  232.       disp(^M^J);
  233.       inc(linenum);
  234.  
  235.       if keypressed then
  236.       begin
  237.          c := readkey;
  238.          if (c = ^K) then
  239.          begin
  240.             disable_int;
  241.             control_k;
  242.             enable_int;
  243.          end
  244.          else
  245.  
  246.          if c <> carrier_lost then
  247.          begin
  248.             inc(pending_keys[0]);
  249.             pending_keys[length(pending_keys)] := c;
  250.          end;
  251.       end;
  252.    end;
  253.  
  254.    procedure displn(msg:  string);
  255.    begin
  256.       disp(msg);
  257.       newline;
  258.    end;
  259.  
  260.    procedure dispc(c: char);
  261.    begin
  262.       disp(c);
  263.    end;
  264.  
  265.    procedure space;
  266.    begin
  267.       dispc(' ');
  268.    end;
  269.  
  270.    (* ------------------------------------------------------------ *)
  271.    procedure spaces(n: integer);
  272.    begin
  273.       while n > 0 do
  274.       begin
  275.          space;
  276.          dec(n);
  277.       end;
  278.    end;
  279.  
  280.  
  281.    (* ------------------------------------------------------------ *)
  282.    procedure input(var line:  string;
  283.                    maxlen:    integer);
  284.    var
  285.       c:     char;
  286.  
  287.    begin
  288.       linenum := 1;
  289.       line := '';
  290.  
  291.       repeat
  292.          c := #0;
  293.  
  294.          while (c = #0) and (not dump_user) do
  295.          begin
  296.             check_time_left;
  297.  
  298.             if length(pending_keys) > 0 then
  299.             begin
  300.                c := pending_keys[1];
  301.                delete(pending_keys,1,1);
  302.             end;
  303.  
  304.             if keypressed then
  305.                c := readkey;
  306.  
  307.             if (not local) then
  308.             begin
  309.                if (port[port_base+MSR] and MSR_RLSD)=0 then
  310.                   c := carrier_lost
  311.                else
  312.                if INTR_receive_ready then
  313.                   c := INTR_receive_data;
  314.  
  315.                if c = carrier_lost then
  316.                  dump_user := true;
  317.             end;
  318.  
  319.             if c = #0 then
  320.                give_up_time;
  321.          end;
  322.  
  323.          if dump_user then
  324.          begin
  325.             displn(' Carrier lost!');
  326.             line := carrier_lost;
  327.             exit;
  328.          end;
  329.  
  330.          case c of
  331.             ' '..#126:
  332.                if maxlen = 0 then
  333.                begin
  334.                   line := c;
  335.                   dispc(c);
  336.                   c := ^M;    {automatic CR}
  337.                end
  338.                else
  339.  
  340.                if length(line) < maxlen then
  341.                begin
  342.                   if (wherex > 78) then
  343.                      newline;
  344.  
  345.                   line := line + c;
  346.                   dispc(c);
  347.                end;
  348.  
  349.             ^H,#127:
  350.                if length(line) > 0 then
  351.                begin
  352.                   dec(line[0]);
  353.                   disp(^H' '^H);
  354.                end;
  355.  
  356.             ^M:   ;
  357.  
  358.             ^B:   displn(wtoa(ofs(c))+'/'+ltoa(memavail));
  359.  
  360.             ^C:   dump_user := true;
  361.          end;
  362.  
  363.       until (c = ^M) or dump_user;
  364.  
  365.    end;
  366.  
  367.  
  368.    (* ------------------------------------------------------------ *)
  369.    procedure erase_prompt(len: integer);
  370.       {remove a prompt from display}
  371.    begin
  372.       dispc(^M);
  373.       spaces(len);
  374.       dispc(^M);
  375.       default_color;
  376.    end;
  377.  
  378.    (* ------------------------------------------------------------ *)
  379.    procedure get_cmdline_raw(len: integer);
  380.    begin
  381.       input(cmdline,len);
  382.       stoupper(cmdline);
  383.       erase_prompt(len+length(cmdline));
  384.    end;
  385.  
  386.    procedure prompt_def(what,options: string);
  387.    begin
  388.       disp(what+' '+options);
  389.    end;
  390.  
  391.    procedure get_def(what,options: string);
  392.    begin
  393.       prompt_def(what,options);
  394.       input(cmdline,sizeof(cmdline)-1);
  395.       stoupper(cmdline);
  396.       newline;
  397.    end;
  398.  
  399.    (* ------------------------------------------------------------ *)
  400.    procedure check_time_left;
  401.    var
  402.       time: integer;
  403.    begin
  404.       time := get_mins;
  405.       tleft := tlimit+ontime-time;
  406.       if tleft < 0 then
  407.       begin
  408.          displn(^M^J'Time limit exceeded!'^M^J);
  409.          dump_user := true;
  410.       end;
  411.    end;
  412.  
  413.    procedure display_time;
  414.    begin
  415.       check_time_left;
  416.       disp('('+itoa(tleft)+' left) ');
  417.    end;
  418.  
  419.    (* ------------------------------------------------------------ *)
  420.    procedure make_log_entry(s:string; f:boolean);
  421.    begin
  422.       if f then displn(s);
  423.    end;
  424.  
  425.    function verify_level(fun: char): boolean;
  426.    begin
  427.       verify_level := true;
  428.    end;
  429.  
  430.    procedure set_function(fun: char);
  431.    begin
  432.    end;
  433.  
  434.    procedure flag_files;
  435.    begin
  436.    end;
  437.  
  438.  
  439. begin
  440.    fillchar(rxque,sizeof(rxque),0);
  441.    fillchar(txque,sizeof(txque),0);
  442.    ontime := get_mins;
  443.    pending_keys := '';
  444. end.
  445.  
  446.